From: Isaku Yamahata Date: Tue, 4 Nov 2008 05:35:24 +0000 (+0900) Subject: [IA64] fix {un}lock_ipi_calllock(). X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14053 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=80f5a6e05615519e841d9d41c6e16bcc78625b79;p=xen.git [IA64] fix {un}lock_ipi_calllock(). Now _raw_spin_lock() checks whether interrupt is masked or not. If masked, it panics. lock_ipi_calllock() violates the assumption. This patch make lock_ipi_calllock() use spin_lock_irqsave() instead of spin_lock_irq(). Signed-off-by: Isaku Yamahata --- diff --git a/xen/arch/ia64/linux-xen/smp.c b/xen/arch/ia64/linux-xen/smp.c index 5ebe45cf38..43786124f1 100644 --- a/xen/arch/ia64/linux-xen/smp.c +++ b/xen/arch/ia64/linux-xen/smp.c @@ -101,6 +101,20 @@ static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned; extern void cpu_halt (void); +#ifdef XEN +/* work around for spinlock irq check. */ +void +lock_ipi_calllock(unsigned long *flags) +{ + spin_lock_irqsave(&call_lock, *flags); +} + +void +unlock_ipi_calllock(unsigned long flags) +{ + spin_unlock_irqrestore(&call_lock, flags); +} +#else void lock_ipi_calllock(void) { @@ -112,6 +126,7 @@ unlock_ipi_calllock(void) { spin_unlock_irq(&call_lock); } +#endif static void stop_this_cpu (void) diff --git a/xen/arch/ia64/linux-xen/smpboot.c b/xen/arch/ia64/linux-xen/smpboot.c index 0cc4de2cd5..ef7f9ea2ff 100644 --- a/xen/arch/ia64/linux-xen/smpboot.c +++ b/xen/arch/ia64/linux-xen/smpboot.c @@ -364,6 +364,10 @@ smp_setup_percpu_timer (void) static void __devinit smp_callin (void) { +#ifdef XEN + /* work around for spinlock irq assert. */ + unsigned long flags; +#endif int cpuid, phys_id; extern void ia64_init_itm(void); @@ -382,9 +386,17 @@ smp_callin (void) fix_b0_for_bsp(); +#ifdef XEN + lock_ipi_calllock(&flags); +#else lock_ipi_calllock(); +#endif cpu_set(cpuid, cpu_online_map); +#ifdef XEN + unlock_ipi_calllock(flags); +#else unlock_ipi_calllock(); +#endif per_cpu(cpu_state, cpuid) = CPU_ONLINE; smp_setup_percpu_timer(); diff --git a/xen/include/asm-ia64/linux-xen/asm/smp.h b/xen/include/asm-ia64/linux-xen/asm/smp.h index 558702b200..048450a3ff 100644 --- a/xen/include/asm-ia64/linux-xen/asm/smp.h +++ b/xen/include/asm-ia64/linux-xen/asm/smp.h @@ -131,8 +131,13 @@ extern void smp_do_timer (struct pt_regs *regs); extern int smp_call_function_single (int cpuid, void (*func) (void *info), void *info, int retry, int wait); extern void smp_send_reschedule (int cpu); +#ifdef XEN +extern void lock_ipi_calllock(unsigned long *flags); +extern void unlock_ipi_calllock(unsigned long flags); +#else extern void lock_ipi_calllock(void); extern void unlock_ipi_calllock(void); +#endif extern void identify_siblings (struct cpuinfo_ia64 *); #else